# -*- coding: utf-8 -*-
from cfwb import derf
from formation.models import UniteFormation, DomaineFormation

uf_attrs = ('libelle', 'niveau', 'type_uf', 'ap_dd', 'ap_de', 'ad_dd', 'ad_de', 'periodes','date_approbation')
django_uf_attrs = ('libelle', 'niveau', 'type_uf', 'ap_dd', 'ap_de', 'ad_dd', 'ad_de', 'periodes','app_doc_8')
orguf_attrs = ('date_debut', 'date_fin', 'statut')

def create_or_update_django_uf(uf, annee_scolaire):
    # Une uf est caractérisée par son numéro adimistratif et son dossier pédagogique
    uf_obj, uf_created = UniteFormation.objects.get_or_create( num_adm = uf.num_adm, code = uf.doc8)
    
    if uf_created:
        # Nouvelle uf django -> création des attributs selon mapping
        print "Creating new django uf %s \t %s \t %s" % (uf.num_adm, uf.doc8, uf.libelle) 
        for (attr, value) in zip(uf_attrs, django_uf_attrs):
            setattr(uf_obj, attr, getattr(uf, value, None))
        # On sauve...   
        uf_obj.save()
        # On crée les organisation le cas échéant
        if uf.organisations:
            for org in uf.organisations:
                print "  Creating organisation %s school year %s for new uf %s\t%s" % (org.num_org, annee_scolaire, uf.num_adm, uf.libelle)
                uf_obj.organisationuf_set.create(
                    num_org=org.num_org,
                    date_debut=org.date_debut,
                    date_fin=org.date_fin,
                    statut=org.statut,
                    annee_scolaire = annee_scolaire
                )
            # Si il y a une organisation, alors, il y a aussi les activités d'enseignement...
            for act in uf.activites:
                print "  Creating activity %s" % (act,)
                (n, c, l, p) = act
                uf_obj.activiteuf_set.create(
                    numero = n,
                    categorie = c,
                    libelle = l,
                    periodes = p,
                )
        # On crée ou récupère le domaine de formation
        obj = DomaineFormation.objects.get_or_create(code_domaine=int(uf.code_domaine), nom_domaine=uf.nom_domaine)[0]
        # et on finit de metter à jour la nouvelle UF, puis on la sauve...
        uf_obj.domaine = obj
        uf_obj.save()
    
    else:
        # On compare les deux objets d'abord sur une liste des attributs simples (pas les organisations ni le domaine d'information)
        # comp contiendra une liste de 4tuples spécifiant les changements
        comp = [ (attr, getattr(uf, attr, None), value, getattr(uf_obj, value, None)) for (attr, value) in zip(uf_attrs, django_uf_attrs) if getattr(uf, attr, None) and not getattr(uf, attr, None) == getattr(uf_obj, value, None)]
        if comp:
            print "Updating uf %s site -> django" % uf.num_adm
            print comp
            for (_, site_value, django_key, _) in comp:
                setattr(uf_obj, django_key, site_value)
                uf_obj.save()
        for org in uf.organisations:
            org_obj, org_created = uf_obj.organisationuf_set.get_or_create(num_org=org.num_org, annee_scolaire=annee_scolaire)
            if org_created:
                print "  Creating organisation %s school year %s for existing uf %s\t%s" % (org.num_org, annee_scolaire, uf.num_adm, uf.libelle)
                for attr in orguf_attrs:
                    setattr(org_obj, attr, getattr(org, attr, None))
                    org_obj.save()
            else:
                comp_org = [ (attr, getattr(org, attr, None), getattr(org_obj, attr, None)) for attr in orguf_attrs if getattr(org, attr, None) and not getattr(org, attr, None) == getattr(org_obj, attr, None) ]
                if comp_org:
                    print "  Updating organisation %s school year %s for existing uf %s\t%s" % (org.num_org, annee_scolaire, uf.num_adm, uf.libelle)
                    print comp_org
                    for (attr, new_value, _) in comp_org:
                        setattr(org_obj, attr, new_value)
                        org_obj.save()
        # Mise à jour des activités d'enseignement le cas échéant
        if uf.activites and not uf_obj.activiteuf_set.all():
            for act in uf.activites:
                print "Updating uf %s site -> django" % uf.num_adm
                print "  Creating activity %s" % (act,)
                (n, c, l, p) = act
                uf_obj.activiteuf_set.create(
                    numero = n,
                    categorie = c,
                    libelle = l,
                    periodes = p,
                )

        # TODO : gérer les changement éventuels de domaines de formation

def populate_django_ufs(SCHOOLYEAR=u"12-13"):

    try:
        UFS = derf.ufs(niveau=u"SI", annee=SCHOOLYEAR)
        UFS.update(derf.ufs(niveau="SS"))
    except Exception:
        raise Exception("Data import failed !")
    else:
        for uf in UFS:
            create_or_update_django_uf(UFS[uf], UFS.annee)


